<!DOCTYPE html>
<html lang="en">


<head>
  <meta charset="utf-8">
  <link href="assets/bash_main.css" rel="stylesheet" type="text/css">
  <link href="assets/bash_technical.css" rel="stylesheet" type="text/css">
  <link href="assets/bash.webmanifest" rel="manifest" type="application/manifest+json">
  <link href="images/webicon/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180" type="image/png">
  <link href="images/webicon/favicon-32x32.png" rel="icon" sizes="32x32" type="image/png">
  <link href="images/webicon/favicon-194x194.png" rel="icon" sizes="194x194" type="image/png">
  <link href="images/webicon/android-chrome-192x192.png" rel="icon" sizes="192x192" type="image/png">
  <link href="images/webicon/favicon-16x16.png" rel="icon" sizes="16x16" type="image/png">
  <link color="#cc0000" href="images/webicon/safari-pinned-tab.svg" rel="mask-icon" type="image/svg+xml">
  <link href="images/webicon/favicon.ico" rel="shortcut icon" type="image/x-icon">
  <meta content="Wrye Bash Docs" name="apple-mobile-web-app-title">
  <meta content="Wrye Bash Docs" name="application-name">
  <meta content="#ffc40d" name="msapplication-TileColor">
  <meta content="images/webicon/mstile-144x144.png" name="msapplication-TileImage">
  <meta content="Wrye Bash Documentation" name="msapplication-tooltip">
  <meta content="assets/browserconfig.xml" name="msapplication-config">
  <meta content="#ffffcc" name="theme-color">
  <script src="assets/bashinit.js"></script>
  <script src="assets/bashfunc.js" async defer></script>
<title>Wrye Bash Technical Readme</title>
</head>


<body>
<div id="header"><h1>Wrye Bash Technical Readme</h1> <a id="jstoggle" href="javascript:void(0)">(Javascript Toggle)</a></div>

<div id="box">
<!-- Scrolling content begin -->

<div id="fade"></div>

<h2 id="contents">Contents</h2>
<div id="navmenu" class="navboxrhrz">
    <div id="navtab">M<br>E<br>N<br>U</div>
    <div class="navcontbar">
        <div class="navhead">
            <a href="javascript:void(0)" class="clsx" id="closebutton">&larr;</a>
            <h2>Technical Readme</h2>
        </div>
        <div class="navcontent">
            <ol class="contentsmenu1 menu">
                <li class="list"><a href="#intro">Introduction</a>
                    <ol class="items">
                        <li><a href="#intro-glossary">Glossary</a></li>
                    </ol>
                </li>
                <li class="list"><a href="#darn">DarNified Formatting</a></li>
                <li class="list"><a href="#wizards">BAIN Wizards</a>
                    <ol class="items">
                        <li><a href="#wizards-overview">Overview</a></li>
                        <li><a href="#wizards-dialog">Dialogues</a></li>
                        <li><a href="#wizards-language">Language Structure</a></li>
                        <li><a href="#wizards-functions">Functions</a></li>
                        <li><a href="#wizards-deprecated-functions">Deprecated Functions</a></li>
                        <li><a href="#wizards-keywords">Keywords</a></li>
                        <li><a href="#wizards-deprecated-keywords">Deprecated Keywords</a></li>
                        <li><a href="#wizards-operators">Operators</a></li>
                        <li><a href="#wizards-constants">Standard Constants</a></li>
                        <li><a href="#wizards-escape">Escape Sequences</a></li>
                        <li><a href="#wizards-examples">Examples</a></li>
                        <li><a href="#wizards-obmm">Wizards vs. OBMM Scripts</a></li>
                    </ol>
                </li>
                <li class="list"><a href="#trusted-binaries">Trusted Binaries</a>
                    <ol class="items">
                        <li><a href="#trusted-binaries-statements">Statements</a></li>
                        <li><a href="#trusted-binaries-structure">Structure</a></li>
                    </ol>
                </li>
            </ol>
        </div>
    </div>
</div>

<h2 id="intro">Introduction</h2>
<p>This readme covers the most technical aspects of Wrye Bash, namely the Wizard scripting language and syntax for certain other file types. Information on the most commonly used aspects of Wrye Bash may be found in the <a href="Wrye%20Bash%20General%20Readme.html">General Readme</a>, and the <a href="Wrye%20Bash%20Advanced%20Readme.html">Advanced Readme</a> holds information on more advanced and less commonly used features. Wrye Bash's version history is stored in the <a href="Wrye%20Bash%20Version%20History.html">Version History</a> document.

<h2 id="darn">DarNified Books Wtxt Formatting</h2>
<p>The DarNified Books setting in the Bashed Patch's tweaks allows the use of Wtxt formatting, which is applied if the first line of a book is <code>== title ==</code>
<ul>
    <li><code>&lt;&lt;</code>, <code>^^</code> or <code>&gt;&gt;</code> at the beginning of a line generate a <code>div align=left</code>, <code>div align=center</code> or <code>div align=right</code> tag respectively.
    <li><code>== text ==</code> generates a level 2 header.
    <li><code>=== text</code> generates a level 3 header.
    <li><code>__text__</code>, <code>~~text~~</code> and <code>**text**</code> generate emphasised text.
</ul>

<h2 id="wizards">BAIN Wizards</h2>
<h3 id="wizards-overview">Overview</h3>
<p>Bain Wizards allow mod authors to include a simple configuration script with their packages. Wizards run on a simple scripting language similar to OBMM script, contained in a <code>wizard.txt</code> file in the package. When run, the wizard will run through a series of windows to allow you to select options, then show a summary page at the end telling you which sub-packages and plugins will be selected, and any INI tweaks that will be applied.</p>
<p>Those using Notepad++ to write their install scripts may want to use Utumno's <a href="https://www.nexusmods.com/oblivion/mods/32654">BAIN wizard Script Highlighter for Notepad plus plus</a> as it features code folding and syntax highlighting to make spotting mistakes easier.
<p>There is a similar <a href="https://www.nexusmods.com/oblivion/mods/34240">BAIN Wizard Syntax for EmEditor</a> syntax highlighter for EmEditor created by broken85.

<h3 id="wizards-dialog">Dialogues</h3>
    <p>You may use a number of different dialogues in a wizard. The available dialogs are described in this section.</p>
    <ul>
        <li>
            <p><dfn>SelectOne</dfn> - This dialog displays a list of options, but only one can be selected. It will be shown when a <a href="#wizardsSelectOne">SelectOne</a> keyword is used.  Each option can display an image associated with it, and a description as well.  To see a larger version of the image displayed, either double click or middle click on the image.  The wizard can specify a default answer, and if you are running it as an Auto-Wizard, then this page will be skipped, using the default option.</p>
            <img alt="SelectOne Dialog" src="../bash/images/readme/selectone.png"/>
        </li>
        <li>
            <p><dfn>SelectMany</dfn> - This dialog displays a list of options, and any combination can be selected (including none at all). It will be shown when a <a href="#wizardsSelectMany">SelectMany</a> keyword is used.  Each option can display an image associated with it, and a description as well.  To see a larger version of the image displayed, either right click or middle click on the image.  The wizard can specify default options, and if you are running it as an Auto-Wizard, then this page will be skipped, using the default options.</p>
            <img alt="SelectMany Dialog" src="../bash/images/readme/selectmany.png"/>
        </li>
        <li>
            <p><dfn>Cancel</dfn> - This dialog will be shown if the wizard cancels execution for some reason, activated by the <a href="#wizardsCancel">Cancel</a> keyword. If a reason is given, it will be displayed.</p>
            <img alt="Cancel Dialog" src="../bash/images/readme/cancel.png"/>
        </li>
        <li>
            <p><dfn>Error</dfn> - This dialog will be shown if the wizard encounters an error in the wizard file. The wizard will then quit.</p>
            <img alt="Error Dialog" src="../bash/images/readme/error.png"/>
        </li>
        <li>
            <p><dfn>Finish</dfn> - This dialog will be shown at the end of the wizard, to show you which sub-packages and plugins will be selected.
                It will be shown either when the end of a wizard file is reached, or if the <a href="#wizardsReturn">Return</a> keyword is used.
                It also shows what INI Tweaks will be applied, and also serves as a place for any extra notes from the mod author to be displayed.</p>
            <img alt="Finish Dialog" src="../bash/images/readme/finish.png"/>
        </li>
        <li>
            <p><dfn>Version Warning</dfn> - This dialog is displayed if the user's system doesn't meet the package's game, script extender or graphics extender requirements. These can be specified via the <a href="#wizardsRequireVersions">RequireVersions</a> keyword.</p>
            <img alt="Version Warning Dialog" src="../bash/images/readme/versions.png"/>
        </li>
    </ul>

<h3 id="wizards-language">Language Structure</h3>
<p>Each line of a Wizard contains one statement. To carry a statement across multiple lines, end each line of the statement with a backslash <code>\</code>. This will cause BAIN to read the next line as if it were part of the first.
<p>Wizard syntax is case-sensitive, apart from filenames. Make sure when writing Wizards that you use the correct case.
<p>Variable names may contain any alphanumeric characters (a-z, A-Z, 0-9) and underscores (_), but cannot start with a number. You cannot declare a variable with the same name as a keyword, function or constant. Variables can be assigned values using an assignment operator, and can hold the following data types:
<ul>
    <li>Integers: whole numbers that can be either positive, negative or zero. You can perform mathematical operations on integers using the mathematical operators.
    <li>Decimals: real numbers that contain a decimal point, eg. <code>0.123</code>, <code>-3.5</code>, <code>7.0</code>. You can perform mathematical operations on decimals using the mathematical operators.
    <li>Strings: any string of characters, eg. <code>"Hello"</code>, <code>'World!'</code>. As in the examples, strings must be enclosed within double or single quotes. Special characters may be included in strings by using an escape sequence. Strings can be added and multiplied using the addition and multiplication operators. One string may be checked for within another using the in operator.
</ul>
<p>Constants are variables that are pre-defined by BAIN and cannot have their values changed. You cannot create new constants.
<p>Comments are extra text ignored by the Wizard engine, to explain what the Wizard code does to other readers. Comments begin with a semicolon <code>;</code> and last until the end of the line.
<p>Expressions are evaluated using the standard order of operations, eg. <code>3 + 6 * 2</code> will evaluate to <code>15</code>.
<h4>Common Mistakes</h4>
<ul>
    <li>Incorrect case. For example, make sure you're using <code>SelectSubPackage</code> and not <code>SeleCtsUbpacKage</code>.
    <li>Mismatched quotes. Make sure that if you start a string with a double quote, you end it with a double quote, and similarly strings that start with a single quote should end with a single quote.
    <li>Missing or extra backslashes at the end of a line. This causes an error or not all options to display.
    <li>Extra spaces or tabs at the end of a line can cause issues with options showing up, eg. <code class="box">"","",""\                  </code>
    <li>Referencing images that don't exist. Make sure any images you try to display in the Wizard actually exist.
</ul>


<h3 id="wizards-functions">Functions</h3>
<p><dfn id="wizardsCompareGameVersion">CompareGameVersion</dfn> - Used to test the installed version of the game Wrye Bash is running for against the version you specify.
<code class="box">CompareGameVersion(version_string)</code>
<ul>
    <li><var>version_string</var> - A string formatted to hold a file version number, eg. <code>"1.2.0.416"</code>.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li><code>-1</code> - Installed version is less than the version specified in <var>version_string</var>.
    <li><code>0</code> - Installed version is equal to the version specified in <var>version_string</var>.
    <li><code>1</code> - Installed version is greater than the version specified in <var>version_string</var>.
</ul>
<p><dfn id="wizardsCompareSEVersion">CompareSEVersion</dfn> - Used to test the installed version of the Script Extender of the game that Wrye Bash is running for against the one you specify.
<code class="box">CompareSEVersion(version_string)</code>
<ul>
    <li><var>version_string</var> - A string formatted to hold a file version number, eg. <code>"0.0.20.1"</code>.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li><code>-1</code> - Installed version is less than the version specified in <var>version_string</var>.
    <li><code>0</code> - Installed version is equal to the version specified in <var>version_string</var>.
    <li><code>1</code> - Installed version is greater than the version specified in <var>version_string</var>, or there is no Script Extender available for the game.
</ul>
<p><dfn id="wizardsCompareGEVersion">CompareGEVersion</dfn> - Used to test the installed version of the Graphics Extender of the game that Wrye Bash is running for against the one you specify.
<code class="box">CompareGEVersion(version_string)</code>
<ul>
    <li><var>version_string</var> - A string formatted to hold a file version number, eg. <code>"3.0.1"</code>.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li><code>-1</code> - Installed version is less than the version specified in <var>version_string</var>.
    <li><code>0</code> - Installed version is equal to the version specified in <var>version_string</var>.
    <li><code>1</code> - Installed version is greater than the version specified in <var>version_string</var>, or there is no Graphics Extender available for the game.
</ul>
<p><dfn>CompareWBVersion</dfn> - Used to test the installed version of Wrye Bash against the one you specify.
<code class="box">CompareWBVersion(version_string)</code>
<ul>
    <li><var>version_string</var> - A string formatted to hold a file version number, eg. <code>"307"</code>.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li><code>-1</code> - Installed version is less than the version specified in <var>version_string</var>.
    <li><code>0</code> - Installed version is equal to the version specified in <var>version_string</var>.
    <li><code>1</code> - Installed version is greater than the version specified in <var>version_string</var>.
</ul>
<p><dfn id="wizardsDataFileExists">DataFileExists</dfn> - Tests for the existence of a file in the Data directory. If the file you are
    testing for is a plugin, this will also detect ghosted versions of the file.</p>
<code class="box">DataFileExists(file_name [, ..., file_name_n])</code>
<ul>
    <li><var>file_name</var> - A string or variable holding a string, specifying the path relative to the Data directory to test. For example
        using <code>"Oblivion.esm"</code> would test for <code>"[path to game]\Data\Oblivion.esm"</code>. Notes:
    <ul>
        <li>When specifying a path below the Data directory, use double slashes to indicate folder separation. For example assuming
            MenuQue.dll is installed correctly, <code>"obse\\plugins\\MenuQue.dll"</code> will work but
            <code>"obse\plugins\MenuQue.dll"</code> will fail.
        <li>You can also look for files above the Data directory using the following syntax: <code>"..\\SoundCommands.log"</code>
        <li>When testing for multiple files, separate each file with commas. They do not have to all be in the same directory. Example:
        <code>DataFileExists("Oblivion.esm","..\\SoundCommands.log","obse\\plugins\\MenuQue.dll")</code> will accurately test to see if each
        of the files exist.
    </ul>
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li><code>True</code> - All of the files exist.
    <li><code>False</code> - One or more of the files do not exist.
</ul>
<p><dfn>GetPluginLoadOrder</dfn> - Returns the current load order index of a plugin in the Data directory.
    You may want to combine this with <a href="#wizardsGetPluginStatus">GetPluginStatus</a>
    to check if the plugin is enabled first.</p>
<code class="box">GetPluginLoadOrder(file_name [, fallback_val])</code>
<ul>
    <li><var>file_name</var> - A string or variable holding a string, specifying the path relative to the Data directory for the plugin whose load order should be retrieved.</li>
    <li><var>fallback_val</var> - The value that should be returned if the plugin has no load order index (e.g. if it is disabled or not installed). <code>-1</code> by default.</li>
</ul>
<p class="indent">Return values:</p>
<ul class="indent">
    <li><var>fallback_val</var> - If the plugin has no load order index.</li>
    <li>Otherwise, a positive integer corresponding to the plugin's load order index.</li>
</ul>
<p><dfn id="wizardsGetPluginStatus">GetPluginStatus</dfn> - Tests the current status of a plugin in the Data directory. Takes ghosting into account when testing the status.</p>
<code class="box">GetPluginStatus(file_name)</code>
<ul>
    <li><var>file_name</var> - A string or variable holding a string, specifying the path relative to the Data directory for the plugin to test.</li>
</ul>
<p class="indent">Return values:</p>
<ul class="indent">
    <li><code>-1</code> - The plugin does not exist.</li>
    <li><code>0</code> - The plugin is not active, imported, or merged. Its checkbox in Wrye Bash's Mods tab is <img alt="Inactive" src="../bash/images/checkbox_green_off.png"/>.</li>
    <li><code>1</code> - The plugin is not active, but has portions imported into the Bashed Patch. Its checkbox in Wrye Bash's Mods tab is <img alt="Imported" src="../bash/images/checkbox_green_imp.png"/>.</li>
    <li><code>2</code> - The plugin is active. Its checkbox in Wrye Bash's Mods tab is <img alt="Active" src="../bash/images/checkbox_green_on.png"/>.</li>
    <li><code>3</code> - The plugin is merged into the Bashed Patch. Its checkbox in Wrye Bash's Mods tab is <img alt="Merged" src="../bash/images/checkbox_green_inc.png"/>.</li>
</ul>
<p><dfn id="wizardsDisableINILine">DisableINILine</dfn> - Tells Wrye Bash to create an ini tweak file that disables the specified setting by commenting it out. Otherwise, behaves identically to <a href="#wizardsEditINI">EditINI</a>.</p>
<code class="box">DisableINILine(file_name, section, setting)</code>
<ul>
    <li><var>file_name</var> - String: the name of the ini file you wish to edit, relative to the Data directory.</li>
    <li><var>section</var> - String: the section in the ini where <var>setting</var> resides.</li>
    <li><var>setting</var> - String: the setting you wish to disable.</li>
</ul>
<p><dfn id="wizardsEditINI">EditINI</dfn> - Tells Wrye Bash to create an ini tweak file with some tweaks in it. If the file that you tell Wrye Bash to apply the tweak to is from the current installer or is the game's ini file, then Wrye Bash will also automatically apply the tweak, otherwise, it will just be generated for the user to apply manually.
<code class="box">EditINI(file_name, section, setting, value [, comment])</code>
<ul>
    <li><var>file_name</var> - String: the name of the ini file you wish to edit, relative to the Data directory.
    <li><var>section</var> - String: the section in the ini where <var>setting</var> resides, or 'set' or 'setGS' or 'SetNumericGameSetting' (see examples below).
    <li><var>setting</var> - String: the setting you wish to change.
    <li><var>value</var> - Any value: the value to set the setting to.
    <li><var>comment</var> - String: Optional. A comment to include with this tweak.
</ul>
<p><dfn id="wizardsExec">Exec</dfn> - This will cause the Wizard to execute lines that are passed to it. This is useful for creating dynamically generated menus.
<code class="box">Exec(lines)</code>
<ul>
    <li><var>lines</var> - A string containing lines to execute, separated by newline characters, or a variable containing such a string. Any backslashes that are to be outputted must be written as triple backslashes. Eg. <code>\'</code> should be written <code>\\\'</code>.
</ul>
<p><dfn id="wizardsEndExec">EndExec</dfn> - Internal function used to mark the end of the lines executed by an <a href="wizardsExec">Exec</a> statement. Attempting to explicitly call it will result in an error.</p>
<code class="box">EndExec(line_count)</code>
<ul>
    <li><var>line_count</var> - The number of lines that the matching <a href="wizardsExec">Exec</a> statement contained.</li>
</ul>
<p><dfn>str</dfn> - Used to convert a value into a string, for example when trying to concantenate a integer or decimal to a string.
<code class="box">str(value)</code>
<ul>
    <li><var>value</var> - Any value. An integer, decimal, variable, constant or string.
</ul>
<p class="indent">Returns:
<ul class="indent">
    <li>String representation of <var>value</var>. For example, <code>str(5)</code> would return <code>"5"</code>.
</ul>
<p><dfn>int</dfn> - Used to convert a value to an integer, for example converting a value held in a string to a integer value.
<code class="box">int(value)</code>
<ul>
    <li><var>value</var> - Any value. An integer, decimal, variable, constant or string.
</ul>
<p class="indent">Returns:
<ul class="indent">
    <li>Integer value of <var>value</var>, if possible. For example <code>int('65')</code> would return <code>65</code>.
    <li><code>0</code> - If integer conversion is not possible.
</ul>
<p><dfn>float</dfn> - Used to convert a value to decimal, for example converting a value held in a string to a decimal value.
<code class="box">float(value)</code>
<ul>
    <li><var>value</var> - Any value. An integer, decimal, variable, constant or string.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li>Decimal value of <var>value</var>, if possible. For example <code>float('2.4')</code> would return <code>2.4</code>.
    <li><code>0.0</code> - If decimal conversion is not possible.
</ul>
<p><dfn>len</dfn> - Used to find the length of a string.
<code class="box">len(string)</code>
<ul>
    <li><var>string</var> - A string, variable, or constant.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li>Length of the string if possible.
    <li><code>0</code> - If length calculation was not possible.
</ul>
<p><dfn id="wizardsendswith">endswith</dfn> - Test what a string ends with.
<code class="box">endswith(string, ending_1 [, ..., ending_n])</code>
<ul>
    <li><var>string</var> - A string, variable or constant.
    <li><var>ending_1</var> through <var>ending_n</var> - A string, variable or constant.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li><code>True</code> - If the string ends in any of the endings specified.
    <li><code>False</code> - If the string does not end in any of the endings specified.
</ul>
<p><dfn id="wizardsstartswith">startswith</dfn> - Test what a string starts with.
<code class="box">startswith(string, prefix_1 [, ..., prefix_n])</code>
<ul>
    <li><var>string</var> - A string, variable or constant.
    <li><var>prefix_1</var> through <var>prefix_n</var> - A string, variable or constant.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li><code>True</code> - If the string begin with any of the prefixes specified.
    <li><code>False</code> - If the string does not begin with any of the prefixes specified.
</ul>
<p><dfn id="wizardslower">lower</dfn> - Convert a string to lower case.
<code class="box">lower(string)</code>
<ul>
    <li><var>string</var> - A string or variable.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li><var>string</var> converted to lowercase if possible.
    <li>The original <var>string</var> if an error occurred.
</ul>
<p><dfn id="wizardsfind">find</dfn> - Return index of first occurrence of a substring.
<code class="box">find(string, substring [, start, stop])</code>
<ul>
    <li><var>string</var> - A string or variable to search in.
    <li><var>substring</var> - A string or variable to search for.
    <li><var>start</var> - Index at which to start searching in <var>string</var>. If not specified, searching will start at the beginning of <var>string</var>.
    <li><var>stop</var> - Index at which to stop searching. Optional. If not specified, searching will stop at the end of <var>string</var>.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li>The index of the first occurrence of <var>substring</var> in <var>string</var>.
    <li><code>-1</code> - If <var>substring</var> could not be found.
</ul>
<p><dfn id="wizardsrfind">rfind</dfn> - Return index of last occurrence of a substring.
<code class="box">rfind(string, substring [, start, stop])</code>
<ul>
    <li><var>string</var> - A string or variable to search in.
    <li><var>substring</var> - A string or variable to search for.
    <li><var>start</var> - Index at which to start searching in <var>string</var>. If not specified, searching will start at the beginning of <var>string</var>.
    <li><var>stop</var> - Index at which to stop searching. Optional. If not specified, searching will stop at the end of <var>string</var>.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li>The index of the last occurrence of <var>substring</var> in <var>string</var>.
    <li><code>-1</code> - If <var>substring</var> could not be found.
</ul>
<p><dfn id="wizardsGetFilename">GetFilename</dfn> - For a string that contains a path, returns the filename part of the string.
<code class="box">GetFilename(path_string)</code>
<ul>
    <li><var>path_string</var> - A string or variable of the path to work with.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li>The filename in <var>path_string</var>.
    <li>An empty string, if <var>path_string</var> is not a path.
</ul>
<p><dfn id="wizardsGetFolder">GetFolder</dfn> - For a string that contains a path, returns the folder part of the string.
<code class="box">GetFolder(path_string)</code>
<ul>
    <li><var>path_string</var> - A string or variable of the path to work with.
</ul>
<p class="indent">Return values:
<ul class="indent">
    <li>The folder in <var>path_string</var>.
    <li>An empty string if <var>path_string</var> does not contain a folder, or is not a path.
</ul>

<h3 id="wizards-deprecated-functions">Deprecated Functions</h3>
<p><dfn id="wizardsCompareObVersion">CompareObVersion</dfn> - Use <a href="#wizardsCompareGameVersion">CompareGameVersion</a> instead.</p>
<p><dfn id="wizardsCompareOBSEVersion">CompareOBSEVersion</dfn> - Use <a href="#wizardsCompareSEVersion">CompareSEVersion</a> instead.</p>
<p><dfn id="wizardsCompareOBGEVersion">CompareOBGEVersion</dfn> - Use <a href="#wizardsCompareGEVersion">CompareGEVersion</a> instead.</p>
<p><dfn id="wizardsGetEspmStatus">GetEspmStatus</dfn> - Use <a href="#wizardsGetPluginStatus">GetPluginStatus</a> instead.</p>

<h3 id="wizards-keywords">Keywords</h3>
<p>Keywords are like functions, but don't require brackets around their arguments, and are used for controlling the flow of a wizard or performing special tasks.
<p><dfn id="wizardsSelectSubPackage">SelectSubPackage</dfn> - Cause the specified sub-package to be selected for installation. This is equivalent to checking the sub-package and all the plugins in that subpackage in the BAIN window.</p>
<code class="box">SelectSubPackage name</code>
<ul>
    <li><var>name</var> - A string or variable holding the name of the sub-package to select.
</ul>
<p><dfn>DeSelectSubPackage</dfn> - Cause the specified sub-package to be de-selected from installation. This is equivalent to un-checking the sub-package in the BAIN window.
<code class="box">DeSelectSubPackage name</code>
<ul>
    <li><code>name</code> - A string or variable holding the name of the sub-package to de-select.
</ul>
<p><dfn id="wizardsSelectPlugin">SelectPlugin</dfn> - Cause the specified plugin to be selected for installation. This is equivalent to checking the plugin in the Plugin Filter of the BAIN window.</p>
<code class="box">SelectPlugin plugin_name</code>
<ul>
    <li><var>plugin_name</var> - A string or variable holding the name of the plugin to select.</li>
</ul>
<p><dfn id="wizardsDeSelectPlugin">DeSelectPlugin</dfn> - Cause the specified plugin to be deselected from installation. This is equivalent to un-checking the plugin in the Plugin Filter of the BAIN window.</p>
<code class="box">DeSelectPlugin plugin_name</code>
<ul>
    <li><var>plugin_name</var> - A string or variable holding the name of the plugin to de-select.</li>
</ul>
<p><dfn>SelectAll</dfn> - Cause all sub-packages and plugins to be selected for installation. This is equivalent to first checking all sub-packages in the BAIN window, then checking all plugins in the Plugin Filter of the BAIN window.</p>
<code class="box">SelectAll</code>
<p><dfn>DeSelectAll</dfn> - Cause all sub-packages and plugins to be de-selected from installation. This is equivalent to first un-checking all plugins in the Plugin Filter of the BAIN window, then un-checking all sub-packages in the BAIN window.</p>
<code class="box">DeSelectAll</code>
<p><dfn id="wizardsSelectAllPlugins">SelectAllPlugins</dfn> - Cause all plugins to be selected for installation. This is equivalent to checking all plugins in the Plugin Filter of the BAIN window.</p>
<code class="box">SelectAllPlugins</code>
<p><dfn id="wizardsDeSelectAllPlugins">DeSelectAllPlugins</dfn> - Cause all plugins to be de-selected from installation. This is equivalent to un-checking all plugins in the Plugin Filter of the BAIN window.</p>
<code class="box">DeSelectAllPlugins</code>
<p><dfn id="wizardsRenamePlugin">RenamePlugin</dfn> - Change the installed name of a plugin. Note that the file extension must stay the same.</p>
<code class="box">RenamePlugin original_name, new_name</code>
<ul>
    <li><var>original_name</var> - The name of the plugin, as it appears in the BAIN package.</li>
    <li><var>new_name</var> - The new name you want to have the plugin installed as.</li>
</ul>
<p><dfn id="wizardsResetPluginName">ResetPluginName</dfn> - Resets the name of a plugin back to its default name.</p>
<code class="box">ResetPluginName original_name</code>
<ul>
    <li><var>original_name</var> - The name of the plugin, as it appears in the BAIN package.</li>
</ul>
<p><dfn id="wizardsResetAllPluginNames">ResetAllPluginNames</dfn> - Resets the names of all plugins back to their default names.</p>
<code class="box">ResetAllPluginNames</code>
<p><dfn>Note</dfn> - Add a note to the user to be displayed at the end of the wizard, on the finish page. The <code>'- '</code> will be added automatically.
<code class="box">Note text</code>
<ul>
    <li><var>text</var> - A string, string variable, or expression that evaluates to a string, to be displayed on the finish page.
</ul>
<p><dfn id="wizardsReturn">Return</dfn> - Signals completion of the wizard. This will jump right to the finish page.
<code class="box">Return</code>
<p><dfn id="wizardsCancel">Cancel</dfn> - Cancels the wizard, with an optional text to display in a dialog as to why the wizard was canceled.
<code class="box">Cancel [text]</code>
<ul>
    <li><var>text</var> - Optional. Text to display in a dialog as to why the wizard was canceled.
</ul>
<p><dfn id="wizardsRequireVersions">RequireVersions</dfn> - Tests the users system against version requirements you specify. If the requirements are not met, a warning dialog will be shown asking if you wish to continue anyway.
<code class="box">RequireVersions game_version [, se_version, ge_version, wrye_bash_version]</code>
<ul>
    <li><var>game_version</var> - Version of the game to test for. See <a href="#wizardsCompareGameVersion">CompareGameVersion</a> for the proper format of the string.
    <li><var>se_version</var> - Optional. Version of the Script Extender to test for. See <a href="#wizardsCompareSEVersion">CompareSEVersion</a> for the proper format of the string.
    <li><var>ge_version</var> - Optional. Version of the Graphics Extender to test for. See <a href="#wizardsCompareGEVersion">CompareGEVersion</a> for the proper format of the string.
    <li><var>wrye_bash_version</var> - Optional. Version of Wrye Bash to test for. See <a href="#wizardsCompareWBVersion">CompareWBVersion</a> for more info.
</ul>
<p><dfn>If-Elif-Else-EndIf</dfn> - A basic If control block.
<code class="box">If statement
   lines
Elif statement
   lines
Elif statement
   lines
Else
   lines
EndIf</code>
<ul>
    <li><code>If</code> - Begins the control block.
    <ul>
        <li><var>statement</var> - If <var>statement</var> evaluates to <code>True</code>, then the lines following it will be run, until the next Elif, Else, or EndIf.
    </ul>
    <li><code>Elif</code>
    <ul>
        <li><var>statement</var> - If <var>statement</var> evaluates to <code>True</code>, and the initial <code>If</code> and none of the previous <code>Elif</code>s were <code>True</code>, then the lines following this <code>Elif</code> will be run, until the next <code>Elif</code>, <code>Else</code>, or <code>EndIf</code>.
    </ul>
    <li><code>Else</code> - If the initial <code>If</code> and none of the previous <code>Elif</code>s were <code>True</code>, then the lines following will be run until an <code>EndIf</code> is met.
    <li><code>EndIf</code> - Signals the end of the <code>If</code> control block.
</ul>
<p><dfn>While-Continue-Break-EndWhile</dfn> - A while loop.
<code class="box">While statement
    lines
    Continue
    lines
    Break
    lines
EndWhile</code>
<ul>
    <li><code>While</code> - Begins the while loop.
    <ul>
        <li><var>statement</var> - If <var>statement</var> evaluates to <code>True</code>, execution of the lines begins, otherwise execution skips to after the <code>EndWhile</code>.
    </ul>
    <li><code>Continue</code> - Signals the while loop to begin over again at the <code>While</code> statement.
    <li><code>Break</code> - Signals the while loop to end execution, skipping to after the <code>EndWhile</code>.
    <li><code>EndWhile</code> - Ends the while loop. <var>statement</var> is re-evaluated, and if <code>True</code>, execution begins again at the start of the <code>While</code> block.
</ul>
<p><dfn id="wizardsForContinueBreakEndFor">For-Continue-Break-EndFor</dfn> - A For loop.
<code class="box">For <var>var</var> from <var>start_value</var> to <var>end_value</var> [by <var>increment_value</var>]
    lines
    Continue
    lines
    Break
    lines
EndFor

For sub in SubPackages
    For file in sub
        lines
    EndFor
EndFor</code>
<ul>
    <li><code>For</code> - Begins the for loop. There are three types of for loop.
    <ul>
        <li><code><var>var</var> from <var>start_value</var> to <var>end_value</var> [by <var>increment_value</var>]</code>
        <ul>
            <li><var>var</var> - A variable that will hold values.
            <li><var>start_value</var> - Initial value of <var>var</var>.
            <li><var>end_value</var> - value of <var>var</var> that will end the for loop.
            <li><var>increment_value</var> - Optional. This the value that will be added to <var>var</var> at the end of each run of the loop. Defaults to <code>1</code> if <var>start_value</var> is greater than <var>end_value</var> or <code>-1</code> otherwise.
        </ul>
        <li><code><var>sub</var> in SubPackages</code> - This type of for loop iterates over the names of the SubPackages in the current package.
        <ul>
            <li><var>sub</var> - A variable that holds the names of the SubPackages.
        </ul>
        <li><code><var>file</var> in <var>sub</var></code> - This type of for loop iterates over the names of the files in the given subpackage. Filenames are relative to the Data directory, before any remapping that would normally be done by BAIN.
        <ul>
            <li><var>file</var> - A variable that holds the filenames.
            <li><var>sub</var> - The name of the subpackage to iterate through.
        </ul>
    </ul>
    <li><code>Continue</code> - Signals the for loop to begin over again at the <code>For</code> statement.
    <li><code>Break</code> - Signals the for loop to end execution, skipping to after the <code>EndFor</code>.
    <li><code>EndFor</code> - Ends the for loop.
</ul>
<p><dfn id="wizardsSelectOne">SelectOne</dfn> - Shows a dialog where the user can select one option from a list of options.
<code class="box">SelectOne 'description', \
        'option 1', 'description 1', 'image 1', \
        'option 2', 'description 2', 'image 2', \
        ...,  \
        'option n', 'description n', 'image n'
Case 'option 1'
    lines
    Break
Case 'option 2'
    lines
    Break

Case 'option n'
    lines
    Break
Default
    lines
    Break
EndSelect</code>
<ul>
    <li><code>SelectOne</code> - After the user presses the "Next" button, this begins a Select control block.
    <ul>
        <li><var>description</var> - The text that will be displayed at the top of the dialog.
        <li><var>option n</var> - The text of the specific option. If the text begins with a "|", this is considered the default option and will be selected by default.
        <li><var>description n</var> - The description to display when <var>option n</var> is selected.
        <li><var>image n</var> - The image to display when <var>option n</var> is selected. An empty string will make no image display.</li>
    </ul>
        Note that you can also use one of the images that come bundled with Wrye Bash in the <code>Mopy/bash/images</code> folder.
        Simply specify the path relative to that folder, and Wrye Bash will look there if it doesn't find a matching image in your
        package. For example, specifying <code>wryesplash.png</code> would allow you to use the Wrye Bash splash screen as an image
        in your wizard.</li>
    <li><code>Case <var>option</var></code> - The lines following the <code>Case</code> will be run if the user selected its corresponding option on the dialog, until a <code>Break</code> or <code>EndSelect</code> is met.
    <ul>
        <li><var>option</var> - The option that the <code>Case</code> corresponds to.
    </ul>
    <li><code>Default</code> - The lines following the <code>Default</code> will be run, until a <code>Break</code> or <code>EndSelect</code>, if none of the <code>Case</code>  options have been run.
    <li><code>Break</code> - Stops running lines in the current <code>Case</code> or <code>Default</code> block.
    <li><code>EndSelect</code> - Signals the end of the Select control block.
</ul>
<p><dfn id="wizardsSelectMany">SelectMany</dfn> - Shows a dialog where the user can select multiple options from a list. After the user presses the "Next" button, this begins a Select control block. See SelectOne for usage.
<code class="box">SelectMany 'description', \
        'option 1', 'description 1', 'image 1', \
        'option 2', 'description 2', 'image 2', \
        ...,  \
        'option n', 'description n', 'image n'
Case 'option 1'
    lines
    Break
Case 'option 2'
    lines
    Break

Case 'option n'
    lines
    Break
EndSelect</code>

<h3 id="wizards-deprecated-keywords">Deprecated Keywords</h3>
<p><dfn>SelectEspm</dfn> - Use <a href="#wizardsSelectPlugin">SelectPlugin</a> instead.</p>
<p><dfn>DeSelectEspm</dfn> - Use <a href="#wizardsDeSelectPlugin">DeSelectPlugin</a> instead.</p>
<p><dfn>SelectAllEspms</dfn> - Use <a href="#wizardsSelectAllPlugins"> SelectAllPlugins</a> instead.</p>
<p><dfn>DeSelectAllEspms</dfn> - Use <a href="#wizardsDeSelectAllPlugins">DeSelectAllPlugins</a> instead.</p>
<p><dfn>RenameEspm</dfn> - Use <a href="#wizardsRenamePlugin">RenamePlugin</a> instead.</p>
<p><dfn>ResetEspmName</dfn> - Use <a href="#wizardsResetPluginName">ResetPluginName</a> instead.</p>
<p><dfn>ResetAllEspmNames</dfn> - Use <a href="#wizardsResetAllPluginNames">ResetAllPluginNames</a> instead.</p>

<h3 id="wizards-operators">Operators</h3>
<h4>Mathematical Operators</h4>
<p>Note: For any of these operators, you can mix decimals and integers. In such a case, the integer will simply be promoted to a decimal, and the result will be a decimal as well.</p>
<p><dfn>Addition</dfn>: <code>+</code>. Adds one integer or decimal to another, or concatenates two strings.</p>
<code class="box">1 + 1          ; == 2
1 + 1.0        ; == 2.0
1.0 + 1        ; == 2.0
1.0 + 1.0      ; == 2.0
"foo" + "bar"  ; == "foobar"</code>
<p><dfn>Subtraction</dfn>: <code>-</code>. Substracts one integer or decimal from another.</p>
<code class="box">1 - 1      ; == 0
1 - 1.0    ; == 0.0
1.0 - 1    ; == 0.0
1.0 - 1.0  ; == 0.0</code>
<p><dfn>Multiplication</dfn>: <code>*</code>. Multiplies one integer or decimal with another, or copies a string multiple times (see example).</p>
<code class="box">1 * 1       ; == 1
1 * 1.0     ; == 1.0
1.0 * 1     ; == 1.0
1.0 * 1.0   ; == 1.0
; Multiplying a string by
; an integer just concatenates
; several copies of it:
"foo" * 2   ; == "foofoo"
3 * "h"     ; == "hhh"
; Note: the other type _must_
; be an integer, decimals
; are not allowed:
2.0 * "a"   ; error</code>
<p><dfn>Division</dfn>: <code>/</code>. Divides one integer or decimal by another. Division by zero causes an error.</p>
<code class="box">1 / 1      ; == 1
1 / 1.0    ; == 1.0
1.0 / 1    ; == 1.0
1.0 / 1.0  ; == 1.0
1 / 0      ; error
1.0 / 0.0  ; error</code>
<p><dfn>Modulo</dfn>: <code>%</code>. Returns the remainder of dividing one integer or decimal by another. If the second argument is 0, an error is raised.</p>
<code class="box">5 % 2      ; == 1
4 % 2      ; == 0
5 % 5      ; == 0
5.0 % 2.5  ; == 0.0
-7 % 4     ; == -3
1 % 0      ; error
1.0 % 0.0  ; error</code>
<p><dfn>Exponentiation</dfn>: <code>^</code>. Raises one integer or decimal to the power of another.</p>
<code class="box">2 ^ 2      ; == 4
2 ^ 2.0    ; == 4.0
2.0 ^ 2    ; == 4.0
2.0 ^ 2.0  ; == 4.0</code>
<h4>Assignment Operators</h4>
<p>Assignment operators are used to assign values to variables. Compound assignment operators are a combination of assignment operator and mathematical operator, performing the operation and assigning it to a variable in one step.</p>
<p><dfn>Assignment</dfn>: <code>=</code></p>
<code class="box">test = 3     ; test now has value 3
foo = "bar"  ; foo now has value "bar"</code>
<p><dfn>Compound Assignment</dfn>: <code>+=</code>, <code>-=</code>, <code>*=</code>, <code>/=</code>, <code>^=</code></p>
<ul>
    <li>Addition (<code>var += expr</code>): Assigns the result of <code>var + expr</code> to <var>var</var>. In other words, this is equivalent to <code>var = var + expr</code>. May also be used to concatenate two strings, just like <code>+</code>.</li>
    <li>Subtraction (<code>var -= expr</code>): Assigns the result of <code>var - expr</code> to <var>var</var>. In other words, this is equivalent to <code>var = var - expr</code>.</li>
    <li>Multiplication (<code>var *= expr</code>): Assigns the result of <code>var * expr</code> to <var>var</var>. In other words, this is equivalent to <code>var = var * expr</code>. May also be used to repeat a string using an integer, just like <code>*</code>.</li>
    <li>Division (<code>var /= expr</code>): Assigns the result of <code>var / expr</code> to <var>var</var>. In other words, this is equivalent to <code>var = var / expr</code>.</li>
    <li>Modulo (<code>var %= expr</code>): Assigns the result of <code>var % expr</code> to <var>var</var>. In other words, this is equivalent to <code>var = var % expr</code>.</li>
    <li>Exponentiation (<code>var ^= expr</code>): Assigns the result of <code>var ^ expr</code> to <var>var</var>. In other words, this is equivalent to <code>var = var ^ expr</code>.</li>
</ul>
<h4>Increment And Decrement Operators</h4>
<p>These operators increase or decrease a variable containing an integer or decimal by 1 and then return the changed value. They can be placed them before or after the variable that should be changed.</p>
<p><em>Warning:</em> If you are familiar with other programming languages, you may expect <code>++var</code> and <code>var++</code> to behave differently. However, in wizards they both behave the same way, returning the new value (<code>var + 1</code>) in both cases. In other words, wizards only support <em>pre-increment</em> and <em>pre-decrement</em> operators.</p>
<ul>
    <li><dfn>Increment</dfn>: <code>++</code>. Increases a variable by <code>1</code> and returns the new value.
    <code class="box">foo = 1      ; foo == 1
bar = foo++  ; foo == 2, bar == 2
++bar        ; foo == 2, bar == 3</code></li>
    <li><dfn>Decrement</dfn>: <code>--</code>. Decreases a variable by <code>1</code> and returns the new value.
    <code class="box">foo = 3      ; foo == 3
bar = foo--  ; foo == 2, bar == 2
--bar        ; foo == 2, bar == 1</code></li>
</ul>
<h4>Boolean Operators</h4>
<p>Boolean operators can be used to test the logical truth of values.
<p><dfn>And</dfn>: <code>&amp;</code>, <code>and</code>. Returns <code>True</code> if both sides of the expression are true and <code>False</code> otherwise.
<code class="box">var1 &amp; var2</code>
<code class="box">var1 and var2</code>
<p><dfn>Or</dfn>: <code>|</code>, <code>or</code>. Returns <code>True</code> if either side of the expression is true and <code>False</code> otherwise.
<code class="box">var1 | var2</code>
<code class="box">var1 or var2</code>
<p><dfn>Not</dfn>: <code>!</code>, <code>not</code>. Returns <code>True</code> if the expression is <code>False</code>, and <code>False</code> if the expression is <code>True</code>.
<code class="box">!value</code>
<code class="box">not value</code>
<p><dfn>In</dfn>: <code>in</code>. Returns <code>True</code> if the left hand side of the expression is contained in the right hand side, and <code>False</code> otherwise.
<code class="box">If value in SubPackages
    ; do something here
EndIf</code>
<h4>Comparison Operators</h4>
<p>Comparison operators are used to compare two values or variables with one another.
<p><dfn>Equal</dfn>: <code>==</code>. Returns <code>True</code> if the left hand side of the expression is equal to the right hand side of the expression, and <code>False</code> otherwise.
<code class="box">var1 == var2</code>
<p><dfn>Not Equal</dfn>: <code>!=</code>. Returns <code>True</code> if the left hand side of the expression is not equal to the right hand side of the expression, and <code>False</code> otherwise.
<code class="box">var1 != var2</code>
<p><dfn>Greater Than or Equal</dfn>: <code>&gt;=</code>. Returns <code>True</code> if the left hand side of the expression is greater than or equal to the right hand side of the expression, and <code>False</code> otherwise.
<code class="box">var1 &gt;= var2</code>
<p><dfn>Greater Than</dfn>: <code>&gt;</code>. Returns <code>True</code> if the left hand side of the expression is greater than the right hand side of the expression, and <code>False</code> otherwise.
<code class="box">var1 &gt; var2</code>
<p><dfn>Less Than or Equal</dfn>: <code>&lt;=</code>. Returns <code>True</code> if the left hand side of the expression is less than or equal to the right hand side of the expression, and <code>False</code> otherwise.
<code class="box">var1 &lt;= var2</code>
<p><dfn>Less Than</dfn>: <code>&lt;</code>. Returns <code>True</code> if the left hand side of the expression is less than the right hand side of the expression, and <code>False</code> otherwise.
<code class="box">var1 &lt; var2</code>
<h4 id="wizards-operators-ci">Case Insensitive Operators</h4>
<p>Some of the operators have case insensitive versions, which function in the same way as their normal versions, but when comparing strings they ignore case. Case insensitive versions of operators end with a colon <code>:</code>. The following case insensitive operators are available:
<ul>
    <li><code>==:</code>
    <li><code>!=:</code>
    <li><code>&gt;=:</code>
    <li><code>&gt;:</code>
    <li><code>&lt;=:</code>
    <li><code>&lt;:</code>
    <li><code>in:</code>
</ul>
<h4 id="wizards-operators-dot">Dot Operator</h4>
<p>The dot operator can be used to call a function on a variable without having to specify the variable in the function's arguments. This functionality will be familiar to anyone with experience in object-oriented programming:
<code class="box">; These two are equivalent
myStr.startswith("foo")
startswith(myStr, "foo")</code>
<p>The following functions can be used with the dot operator:
<ul>
    <li><code>len</code>
    <li><code>endswith</code>
    <li><code>startswith</code>
    <li><code>lower</code>
    <li><code>find</code>
    <li><code>rfind</code>
</ul>
<h4>Indexing and Slicing</h4>
<p>Indexing is used to access a specific location in a sequence. Slicing is an extension of indexing that returns a part of the sequence. Currently only strings and string variables can be indexed / sliced. The syntax used is identical to Python's syntax.</p>
<p><dfn>Indexing</dfn>:</p>
<code class="box">string[index]</code>
<ul>
    <li><var>index</var>: The index to retrieve an item from. The first item in a sequence has an index of 0.</li>
</ul>
<p><dfn>Slicing</dfn>:</p>
<code class="box">string[start:stop:step]</code>
<ul>
    <li><var>start</var>: The index to start at. The first item in a sequence has an index of 0. If not specified, indexing will begin at 0.</li>
    <li><var>stop</var>: The index to stop at. If not specified but a colon <code>:</code> is supplied, indexing will continue to the end of the sequence. If not specified and no colon is supplied, only one character will be indexed.</li>
    <li><var>step</var>: How much to increment by when indexing. For example, a value of <code>2</code> would return every second item in the sequence. If not specified, a value of <code>1</code> will be used.</li>
</ul>
<p>Negative values for <var>index</var>, <var>start</var> and <var>stop</var> will be relative to the end of the sequence. For example, <code>-1</code> would mean the first character from the end of the sequence.</p>
<p>Examples:</p>
<code class="box">"Hello"[0]    ; returns "H"
"Hello"[2]    ; returns "l"
"Hello"[0:]   ; returns "Hello"
"Hello"[:]    ; returns "Hello"
"Hello"[0:2]  ; returns "He"
"Hello"[-1]   ; returns "o"
"Hello"[1:3]  ; returns "el"
"Hello"[-2:]  ; returns "lo"
</code>

<h3 id="wizards-constants">Standard Constants</h3>
<p>Only three constants are defined in BAIN Wizards:
<p><dfn>True</dfn> - <code>True</code>. Equal to boolean <code>true</code> (text representation) or <code>1</code> (binary representation).</p>
<p><dfn>False</dfn> - <code>False</code>. Equal to boolean <code>false</code> (text representation) or <code>0</code> (binary representation).</p>
<p><dfn>SubPackages</dfn> - A list of strings. Contains the names of the subpackages of the installer that this wizard belongs to. Can be iterated over with a <code>For</code> statement or used with the <code>in</code> operator.</p>

<h3 id="wizards-escape">Escape Sequences</h3>
<p>Escape sequences are special sequences of characters you can use to get a different character outputted. The escape sequences allowed are:
<ul>
    <li><code>\"</code>: Outputs a double quote character <code>"</code>. This allows you to put quotes in a string without causing the Wizard engine to think it's reached the end of the string.
    <li><code>\'</code>: Outputs a single quote character <code>'</code>. This allows you to put quotes in a string without causing the Wizard engine to think it's reached the end of the string.
    <li><code>\t</code>: Outputs a tab.
    <li><code>\n</code>: Outputs a new line.
    <li><code>\\</code>: Outputs a backslash <code>\</code>.
</ul>

<h3 id="wizards-examples">Examples</h3>
<h4>Wizards In The Wild</h4>
<p>The following mods have Wizard scripts that may be useful references: <a href="https://www.nexusmods.com/oblivion/mods/19628">Animated Window Lighting System and Chimneys - AWLS</a>,  <a href="https://www.nexusmods.com/oblivion/mods/31062">Bain Conversion Files</a>,  <a href="https://www.nexusmods.com/oblivion/mods/16513">Bananasplit Better Cities</a>,  <a href="https://www.nexusmods.com/oblivion/mods/36005">Fast and Easy Frans WIZBAIN Archive Maker -ENGLISH ONLY-</a>,  <a href="https://www.nexusmods.com/oblivion/mods/35856">Metallicow Cursor Mod</a>,  <a href="https://www.nexusmods.com/oblivion/mods/19370">Unique Landscapes Compilation</a>,  <a href="https://www.nexusmods.com/oblivion/mods/18305">Weather - All Natural</a>.
<h4>Create A Package Overview</h4>
<p>Every Wizard should have a short overview for the user to read before proceeding with the actual installation questions. Notice how in the example below there are no <code>Case</code> statements used and the default character <code>|</code> is before the <code>Start Here_Readme</code>.
<code class="box">SelectOne "Welcome to the ExampleMod's mod Setup Wizard", \
    "|Start Here_Readme", "If this is the first time you install this mod it's recommended that you carefully read the rest of the selections readme's to have an idea of what the optional parts of this mod do.", "", \
    "ExampleMod Overview", "ExampleText bla bla bla \n\nBla Bla Bla \n\n Bla Bla\n Bla", "", \
    "Changelog", "Example Fixes Release 1.01 \nExample Full Public 1.0 Release \nExample 2nd Beta Release 0.91 \n0.9 - Example Beta Release \n0.3 - Example Alpha Release \n0.01 - Example Initial Release", "", \
    "Guidelines for a Example install", "", "", \
    "ExampleMod Screenshots", "", "Screenshots\\ExampleScreenshot.jpg", \
    "Credits\\Authors", "Wrye - For BAIN. Woooooooot! \nLojack - For the wonderful BAIN wizard installer feature. \nMetallicow - For chewing the cud.", "", \
    "Language", "Language or Nationality this BAIN wizard was written in. \n\n English (USA)", "Wizard Images\\EnglishUSA.jpg"
EndSelect
</code>
<h4>Yes/No Question</h4>
<p>Useful for when you want to ask the user a yes/no question. <code>SelectOne</code> and <code>SelectSubPackage</code> in the example below could be replaced by another keyword.
<code class="box">SelectOne "Example: Yes/No Question?", \
      "Yes", "Description", "Wizard Images\\Yes.jpg", \
      "No", "Description", "Wizard Images\\No.jpg"
    Case "Yes"
        SelectSubPackage "00 Example Subpackage" ;;;Action/No Action
        Break
    Case "No"
        ;No Plugin ;;Action/No Action
        Break
EndSelect
</code>
<h4>Check For A Plugin</h4>
<p>Lets say that you want to check the users data folder for a specific plugin, to check if a patch (you might have created) should apply.
<code class="box">If DataFileExists("ExamplePlugin.esp")
    Note "ExamplePlugin Detected." ;;;Action/No Action
    SelectPlugin "PatchPlugin.esp" ;;;Action/No Action
Else ; ExamplePlugin.esp wasn't detected
    ; No Plugin                    ;;;Action/No Action
EndIf
</code>
<h4>Use New BAIN Wizard Features Safely</h4>
<p>Useful for when you use features available only in recent versions of Wrye Bash but want to retain support for users with older versions.
<code class="box">If CompareWBVersion('292') &gt;= 0
    ; User is running 292+
    ; Do some 292+ only stuff here, like...
    EditINI('Oblivion.ini', 'Display', 'bAllowScreenShot', 1)
Else
    ; User is running &lt; 292, so EditINI is unavailable.
    Note "Don't forget to enable screenshots in Oblivion.ini"
EndIf
</code>
<h4>Misc. Function Examples</h4>
<p>These:
<code class="box">EditINI('TargetINI.ini', 'set', 'ANVars.UseEW', 1)
EditINI('TargetINI.ini', 'setGS', 'fPCBaseMagickaMult', 1)
EditINI('TargetINI.ini', 'SetNumericGameSetting', 'fPerkSneakAttackMarksmanNoviceMult', 1.5, "default is 2.0")
</code>
<p>Would create Ini Tweaks:
<code class="box">set ANVars.UseEW to 1
setGS fPCBaseMagickaMult 1
SetNumericGameSetting fPerkSneakAttackMarksmanNoviceMult 1.5;default is 2.0
</code>
<p>This:
<code class="box">GetFilename("C:\Program Files\Bethesda Softworks\Oblivion\Oblivion.exe")</code>
<p>Would return <code>"Oblivion.exe"</code>. This:
<code class="box">GetFilename("C:\Program Files\Bethesda Softworks\Oblivion")</code>
<p>Would return an empty string.
<p>This:
<code class="box">GetFolder("Data\mine.esp")</code>
<p>Would return <code>"Data"</code>. This:
<code class="box">GetFolder("mine.esp")</code>
<p>Would return an empty string.

<h3 id="wizards-obmm">Wizards vs. OBMM Scripts</h3>
<p>This section compares the functions and keywords available in Wizards against those available in OBMM scripts.
<h4>Functionality with direct correlation between OBMM scripts and Wizards</h4>
<table>
    <thead><tr><th>OBMM Script<th>Wizards
    <tbody>
        <tr><td><code class="box">If &lt;function&gt; [...]
IfNot &lt;function&gt; [...]</code>
            <td><code class="box">If statement
If not statement</code>
        <tr><td><code class="box">Else
EndIf</code>
            <td><code class="box">Elif
Else
EndIf</code>
        <tr><td><code class="box">If DialogYesNo &lt;Message&gt; [Title]</code>
            <td><code class="box">SelectOne message, "Yes", yes_description, yes_image, "No", no_description, no_image
Case "Yes"
    statements
    Break
Case "NO"
    statements
    Break
EndSelect</code>
        <tr><td><code class="box">If DataFileExists &lt;FileName&gt;</code>
            <td><code class="box">If DataFileExists(filename)</code>
        <tr><td><code class="box">If ScriptExtenderPresent</code>
            <td><code class="box">If CompareSEVersion("0.0.0.0") == 1</code>
        <tr><td><code class="box">If ScriptExtenderNewerThan &lt;version&gt;</code>
            <td><code class="box">If CompareSEVersion(version) == 1</code>
        <tr><td><code class="box">If GraphicsExtenderPresent</code>
            <td><code class="box">If CompareGEVersion("0.0.0.0") == 1</code>
        <tr><td><code class="box">If GraphicsExtenderNewerThan &lt;version&gt;</code>
            <td><code class="box">If CompareGEVersion(version) == 1</code>
        <tr><td><code class="box">If OblivionNewerThan &lt;version&gt;</code>
            <td><code class="box">If CompareGameVersion(version) == 1</code>
        <tr><td><code class="box">If Equal &lt;arg1&gt; &lt;arg2&gt;
If GreaterThan &lt;arg1&gt; &lt;arg2&gt;
If GreaterEqual &lt;arg1&gt; &lt;arg2&gt;
If fGreaterThan &lt;arg1&gt; &lt;arg2&gt;
If fGreaterEqual &lt;arg1&gt; &lt;arg2&gt;</code>
            <td><code class="box">If statement == statement
If statement &gt; statement
If statement &gt;= statement
If statement &gt; statement
If statement &gt;= statement</code>
        <tr><td><code class="box">Select &lt;Title&gt; &lt;Option1&gt; [Option2] [...]
SelectWithPreview &lt;Title&gt; &lt;Option1&gt; &lt;ImagePath1&gt; [Option2] [ImagePath2] [...]
SelectWithDescriptions &lt;Title&gt; &lt;Option1&gt; &lt;Description1&gt; [Option2] [Description2] [...]
SelectWithDescriptionsAndPreviews &lt;Title&gt; &lt;Option1&gt; &lt;ImagePath1&gt; &lt;Description1&gt; [Option2] [ImagePath2] [Description2] [...]</code>
            <td><code class="box">SelectOne title, option1, description1, image1, option2, description2, image2 [...]</code>
        <tr><td><code class="box">SelectMany &lt;Title&gt; &lt;Option1&gt; [Option2] [...]
SelectManyWithPreview &lt;Title&gt; &lt;Option1&gt; &lt;ImagePath1&gt; [Option2] [ImagePath2] [...]
SelectManyWithDescriptions &lt;Title&gt; &lt;Option1&gt; &lt;Description1&gt; [Option2] [Description2] [...]
SelectManyWithDescriptionsAndPreviews &lt;Title&gt; &lt;Option1&gt; &lt;ImagePath1&gt; &lt;Description1&gt; [Option2] [ImagePath2] [Description2] [...]</code>
            <td><code class="box">SelectMany title, option1, description1, image1 [...]</code>
        <tr><td><code class="box">Case &lt;option&gt;
    Default
    Break
EndSelect</code>
            <td><code class="box">Case option
    Default
    Break
EndSelect</code>
        <tr><td><code class="box">For Count &lt;Variable&gt; &lt;Start&gt; &lt;End&gt; [Step]
    Continue
    Exit
EndFor</code>
            <td><code class="box">For variable from start to end by step
    Continue
    Break
EndFor</code>
        <tr><td><code class="box">Return</code>
            <td><code class="box">Return</code>
        <tr><td><code class="box">DontInstallPlugin &lt;Plugin&gt;
InstallPlugin &lt;Plugin&gt;</code>
            <td><code class="box">DeSelectPlugin plugin
SelectPlugin plugin</code>
        <tr><td><code class="box">CopyPlugin &lt;CopyFrom&gt; &lt;CopyTo&gt;</code>
            <td><code class="box">RenamePlugin original_name new_name</code>
        <tr><td><code class="box">EditINI &lt;section&gt; &lt;key&gt; &lt;value&gt;</code>
            <td><code class="box">EditINI("Oblivion.ini", section, setting, value)</code>
        <tr><td><code class="box">FatalError</code>
            <td><code class="box">Cancel [message]</code>
        <tr><td><code class="box">SetVar &lt;Variable&gt; &lt;Value&gt;</code>
            <td><code class="box">variable = value</code>
        <tr><td><code class="box">StringLength &lt;Variable&gt; &lt;String&gt;</code>
            <td><code class="box">variable = len(string)
variable = string.len()</code>
        <tr><td><code class="box">iSet &lt;Variable&gt; &lt;expression&gt;
fSet &lt;Variable&gt; &lt;expression&gt;</code>
            <td><code class="box">variable = expression</code>
        <tr><td><code class="box">ExecLines &lt;lines&gt;</code>
            <td><code class="box">Exec(lines)</code>
        <tr><td><code class="box">SubString &lt;Variable&gt; &lt;String&gt; &lt;startfrom&gt; [length]</code>
            <td><code class="box">find(variable, string, start, stop)
variable.find(string, start, stop)</code>
</table>
<h4>Functions in OBMM with equivalent methods in Wizards</h4>
<table>
    <thead><tr><th>OBMM Script<th>Wizards
    <tbody>
        <tr><td><code class="box">If VersionGreaterThan &lt;version&gt;
If VersionLessThan &lt;version&gt;</code>
            <td>Use <code>CompareWBVersion</code> to check the Wrye Bash version.
        <tr><td><code class="box">Message &lt;Message&gt; [Title]
DisplayImage &lt;Image File Path&gt; [Title]
DisplayText &lt;Text File Path&gt; [Title]</code>
            <td>Similar functionality can be reproduced using <code>Note</code> and <code>SelectOne</code> or <code>SelectMany</code> keywords.
        <tr><td><code class="box">ConflictWith &lt;ModName&gt; [Comment] [Level]
DependsOn &lt;ModName&gt; [Comment] [Level]</code>
            <td>Similar functionality can be reproduced using <code>If DataFileExists(modname)</code>.
        <tr><td><code class="box">DontInstallDataFile &lt;FileName&gt;
InstallDataFile &lt;FileName&gt;
DontInstallDataFolder &lt;FolderName&gt; [RecurseSubfolders]
InstallDataFolder &lt;FolderName&gt; [RecurseSubfolders]
CopyDataFile &lt;CopyFrom&gt; &lt;CopyTo&gt;
CopyDataFolder &lt;CopyFrom&gt; &lt;CopyTo&gt; [RecurseSubfolders]</code>
            <td>Similar functionality can be obtained by packaging the mod differently, and then using <code>SelectSubPackage</code> and <code>DeSelectSubPackage</code>.
            <tr><td><code class="box">For Each DataFolder &lt;Variable&gt; &lt;FolderPath&gt; [RecurseSubFolders] [SearchString]
For Each DataFile &lt;Variable&gt; &lt;FolderPath&gt; [RecurseSubFolders] [SearchString]
For Each PluginFolder &lt;Variable&gt; &lt;FolderPath&gt; [RecurseSubFolders] [SearchString]
For Each Plugin &lt;Variable&gt; &lt;FolderPath&gt; [RecurseSubFolders] [SearchString]</code>
            <td>Use:
            <code class="box">For subpackage in SubPackages</code>
            <p>and/or:
            <code class="box">For file in subpackage</code>
            <p>to iterate over files and folders in an installer. Then use:
            <code class="box">file.lower().endswith(".esp")
GetFilename(file)
GetFolder(file)</code>
            <p>and other string manipulation functions to test file names and folders.
</table>
<h4>Functions in OBMM without equivalent methods in Wizards</h4>
<code class="box">SelectVar &lt;Variable&gt;
SelectString &lt;Variable&gt;
Goto &lt;label&gt;
Label &lt;label&gt;
LoadBefore &lt;Plugin1&gt; &lt;Plugin2&gt;
LoadAfter &lt;Plugin1&gt; &lt;Plugin2&gt;
UncheckESP &lt;plugin&gt;
SetDeactivationWarning &lt;plugin&gt; &lt;warning&gt;
ConflictsWith &lt;ModName&gt; &lt;MinMajorVersion&gt; &lt;MinMinorVersion&gt;&lt;MaxMajorVersion&gt; &lt;MaxMinorVersion&gt; [Comment] [Level]
ConflictsWithRegex &lt;ModName&gt; [Comment] [Level]
ConflictsWithRegex &lt;ModName&gt; &lt;MinMajorVersion&gt; &lt;MinMinorVersion&gt;&lt;MaxMajorVersion&gt; &lt;MaxMinorVersion&gt; [Comment] [Level]
DependsOn &lt;ModName&gt; &lt;MinMajorVersion&gt; &lt;MinMinorVersion&gt;&lt;MaxMajorVersion&gt; &lt;MaxMinorVersion&gt; [Comment] [Level]
DependsOnRegex &lt;ModName&gt; [Comment] [Level]
DependsOnRegex &lt;ModName&gt; &lt;MinMajorVersion&gt; &lt;MinMinorVersion&gt;&lt;MaxMajorVersion&gt; &lt;MaxMinorVersion&gt; [Comment] [Level]
RegisterBSA &lt;FileName&gt;
UnregisterBSA &lt;FileName&gt;
EditShader &lt;ShaderPackage&gt; &lt;ShaderName&gt; &lt;BinaryObjectPath&gt;
SetGMST &lt;file&gt; &lt;Editor ID&gt; &lt;new value&gt;
SetGlobal &lt;file&gt; &lt;Editor ID&gt; &lt;new value&gt;
SetPluginByte &lt;file&gt; &lt;offset&gt; &lt;new value&gt;
SetPluginByte &lt;file&gt; &lt;offset&gt; &lt;new value&gt;
SetPluginShort &lt;file&gt; &lt;offset&gt; &lt;new value&gt;
SetPluginLong &lt;file&gt; &lt;offset&gt; &lt;new value&gt;
SetPluginFloat &lt;file&gt; &lt;offset&gt; &lt;new value&gt;
GetFolderName &lt;Variable&gt; &lt;path&gt;
GetFileName &lt;Variable&gt; &lt;path&gt;
GetFileNameWithoutExtension &lt;Variable&gt; &lt;path&gt;
CombinePaths &lt;Variable&gt; &lt;path1&gt; &lt;path2&gt;
RemoveString &lt;Variable&gt; &lt;String&gt; &lt;startfrom&gt; [length]
InputString &lt;Variable&gt; [Title] [Initial]
ReadINI &lt;Variable&gt; &lt;section&gt; &lt;value&gt;
ReadRenderInfo &lt;Variable&gt; &lt;value&gt;
EditXMLLine &lt;file&gt; &lt;line number&gt; &lt;new line&gt;
EditXMLReplace &lt;file&gt; &lt;text to find&gt; &lt;text to replace&gt;
</code>
<h4>Functions in Wizards without equivalent methods in OBMM</h4>
<code class="box">CompareWBVersion(version)
GetPluginStatus(plugin)
DisableINILine(file_name, section, setting)
str(value)
int(value)
float(value)
SelectAll
DeSelectAll
SelectAllPlugins
DeSelectAllPlugins
While expression
    Continue
    Break
EndWhile
RequireVersions oblivion, obse, obge, wrye_bash
</code>
<h4>Functions in OBMM that are meaningless in Wrye Bash</h4>
<table>
    <thead><tr><th>OBMM Script<th>Wizards
    <tbody>
        <tr><td><code class="box">PatchDataFile &lt;NewFile&gt; &lt;FileToPatch&gt; [Create]
PatchPlugin &lt;NewFile&gt; &lt;FileToPatch&gt; [Create]</code>
            <td>Unnecessary due to BAIN's conflict resolution abilities.
        <tr><td><code class="box">AllowRunOnLines</code><td>Wizards support run-on lines as standard.
</table>

<h2 id="trusted-binaries">Trusted Binaries</h2>
<p>This format is used for exporting and importing data by the
    <a href="Wrye%20Bash%20Advanced%20Readme.html#settings-trusted-binaries">Trusted Binaries</a>
    settings page. It is a simple plaintext format, stored with UTF-8 encoding
    (do <em>not</em> include a BOM when writing, but be ready to handle a BOM
    when reading since versions of Wrye Bash before 309 wrote BOMs) in files
    with the <code>.txt</code> extension.</p>
<p>Each line is either a <em>statement</em> or a <em>comment</em>. If the line
    begins with one of they statement keywords, as described below, it is a
    statement. Otherwise, it is considered a comment and ignored
    completely. Almost all spaces (the exceptions are spaces inside string
    variables) are optional and ignored. Line terminators may be either
    Windows-style or Unix-style.</p>
<p>As you may be able to tell, the syntax is pretty ugly. That's because a lot
    of this was generated by simply writing out Python <code>repr()</code>s,
    and we can't change it for backwards compatibility reasons.</p>

<h3 id="trusted-binaries-statements">Statements</h3>
<ul>
    <li>
        <p><dfn id="trusted-binaries-badDlls">badDlls</dfn> - Begins a block of
            'bad' binaries. All <a href="#trusted-binaries-dll">dll</a>
            statements after this one will be considered 'bad', meaning that
            BAIN will silently skip their installation.</p>
        <code class="box">badDlls [comment]</code>
        <ul>
            <li><var>comment</var> - An optional comment after the keyword.</li>
        </ul>
    </li>
    <li>
        <p><dfn id="trusted-binaries-dll">dll</dfn> - Begins a new binary
            entry. May optionally be terminated with a colon.</p>
        <code class="box">dll: path [:]</code>
        <ul>
            <li><var>path</var> - The path to the binary, relative to the Data
                folder. Note that both <code>/</code> and <code>\</code> will
                be considered valid path separators here, so Unix pathnames
                like <code>skse/plugins/my\file\with\backlashes.so</code>
                cannot be handled by BAIN. Maybe consider a saner name for your
                binary?</li>
        </ul>
    </li>
    <li>
        <p><dfn id="trusted-binaries-goodDlls">goodDlls</dfn> - Begins a block of
            'good' binaries. All <a href="#trusted-binaries-dll">dll</a>
            statements after this one will be considered 'good', meaning that
            BAIN will allow their installation.</p>
        <code class="box">goodDlls [comment]</code>
        <ul>
            <li><var>comment</var> - An optional comment after the keyword.</li>
        </ul>
    </li>
    <li>
        <p><dfn id="trusted-binaries-version">version</dfn> - Adds a version
            entry to the last binary (as specified by the last
            <a href="#trusted-binaries-dll">dll</a> statement). Note that the
            <code>\[</code> and <code>\]</code> below stand for literal '[' and
            ']' characters, instead of the usual meaning (an optional part of
            the syntax).</p>
        <code class="box">version [index]: \[[u]name, size[L], crc[L]\]</code>
        <ul>
            <li><var>index</var> - An optional number for human readability.
                Useful if a single binary has multiple version entries.</li>
            <li><var>name</var> - The name of the package that this version of
                the binary came from (with file extensions stripped). This is a
                string surrounded by single or double quotes. The string can
                also have a <code>u</code> prefix (before the quotes), which is
                ignored if it's present.</li>
            <li><var>size</var> - The size of this version of the binary. A
                decimal integer. May have an <code>L</code> suffix, which is
                ignored if it's present.</li>
            <li><var>crc</var> - The CRC-32 of this version of the binary. A
                decimal integer. May have an <code>L</code> suffix, which is
                ignored if it's present.</li>
        </ul>
    </li>
</ul>

<h3 id="trusted-binaries-structure">Structure</h3>
<p>There is no hard and fast structure for this format. Two rules do have to be
    observed, however:</p>
<ul>
    <li>Before a <a href="#trusted-binaries-dll">dll</a> statement can occur, a
        <a href="#trusted-binaries-goodDlls">goodDlls</a> or
        <a href="#trusted-binaries-badDlls">badDlls</a> statement must have
        occurred on some previous line.</li>
    <li>Before a <a href="#trusted-binaries-version">version</a> statement can
        occur, a <a href="#trusted-binaries-dll">dll</a> statement must have
        occurred on some previous line.</li>
</ul>
<p>Breaking one of these rules is a syntax error, which will result in Wrye
    Bash showing an error popup if one attempts to import the file.</p>
<p>It is suggested to use only one
    <a href="#trusted-binaries-goodDlls">goodDlls</a> and
    <a href="#trusted-binaries-badDlls">badDlls</a> block per file and only one
    <a href="#trusted-binaries-dll">dll</a> statement per binary per block. The
    following is an example file exported by Wrye Bash 307:</p>
<code class="box">goodDlls (those dlls that you have chosen to allow to be installed)
dll:skse\plugins\chargen.dll:
version 00: [u'RaceMenu v3-4-5-29624-3-4-5', 585216, 2162501321L]
dll:skse\plugins\nioverride.dll:
version 00: [u'RaceMenu v3-4-5-29624-3-4-5', 827904, 1370081254]
dll:skse\plugins\additemmenule.dll:
version 00: [u'AddItemMenuLE320_SKSE173-64905-3-2-1557583553', 268800, 1953112203]
dll:skse\plugins\storageutil.dll:
version 00: [u'Campfire 1.11-64798-1-11', 978944, 50366834]
version 01: [u'PapyrusUtil - Scripting Utility Functions-58705-3-3', 978944, 50366834]
badDlls (those dlls that you have chosen to NOT allow to be installed)
None</code>
<p>Note the comments after the
    <a href="#trusted-binaries-goodDlls">goodDlls</a> and
    <a href="#trusted-binaries-badDlls">badDlls</a> statements, as well as the
    <code>None</code> line - that is a comment too.</p>
<p>Importing this file would result in four binaries being added to the 'good'
    binaries list. BAIN would allow these to be installed according to the
    version entries they have. The following list illustrates this:</p>
<ul>
    <li><code>skse\plugins\chargen.dll</code> may be installed, but
        <strong>only</strong> if:
        <ul>
            <li>It comes from a package with the name (ignoring extensions)
                'RaceMenu v3-4-5-29624-3-4-5', has a size of 585216 bytes and
                has a CRC-32 of 2162501321.</li>
        </ul>
    </li>
    <li><code>skse\plugins\nioverride.dll</code> may be installed, but
        <strong>only</strong> if:
        <ul>
            <li>It comes from a package with the name (ignoring extensions)
                'RaceMenu v3-4-5-29624-3-4-5', has a size of 827904 bytes and
                has a CRC-32 of 1370081254.</li>
        </ul>
    </li>
    <li><code>skse\plugins\additemmenule.dll</code> may be installed, but
        <strong>only</strong> if:
        <ul>
            <li>It comes from a package with the name (ignoring extensions)
                'AddItemMenuLE320_SKSE173-64905-3-2-1557583553', has a size of
                268800 bytes and has a CRC-32 of 1953112203.</li>
        </ul>
    </li>
    <li><code>skse\plugins\storageutil.dll</code> may be installed, but
        <strong>only</strong> if:
        <ul>
            <li>It comes from a package with the name (ignoring extensions)
                'Campfire 1.11-64798-1-11', has a size of 978944 bytes and
                has a CRC-32 of 50366834, <strong>or</strong></li>
            <li>It comes from a package with the name (ignoring extensions)
                'PapyrusUtil - Scripting Utility Functions-58705-3-3', has a
                size of 978944 bytes and has a CRC-32 of 50366834.</li>
        </ul>
    </li>
</ul>

<!-- Scrolling content end -->
</div>

<div id="footer">
    <div id="version">Wrye Bash v309.1</div>
    <a href="Wrye Bash General Readme.html">General</a>&#160;&#x2726;&#160;<a href="Wrye Bash Advanced Readme.html">Advanced</a>&#160;&#x2726;&#160;Technical&#160;&#x2726;&#160;<a href="Wrye Bash Version History.html">Versions</a>
    <div id="oldie">Javascript disabled, menu and slideshows nonfunctional.</div>
</div>
</body>

</html>
